package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.service.CategoryService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author ：石破天
 * @date ：Created in 2022年11月19日
 * @description ：
 * @version: 1.0
 */
@Slf4j
@RestController
@RequestMapping("/category")
public class CategoryController {


    @Autowired
    private CategoryService categoryService;

    /**
     * 保存
     * @param category
     * @return
     */
    @PostMapping
    public R<String>  save(@RequestBody Category category){
//找service进行保存
        categoryService.save(category);

        return R.success("添加分类成功");

    }


    @GetMapping("/page")
    public R<Page> page(Integer page,Integer pageSize){
        //1:构建 分页构造器
        Page<Category> pageInfo = new Page<>(page,pageSize);
        //2:构建 条件构造器 wrapper
        LambdaQueryWrapper<Category> wrapper = new LambdaQueryWrapper<>();
        // 显示潜规则   按照sort进行排序 默认升序 越小越先展示
        wrapper.orderByAsc(Category::getSort);//按照排序默认规则
        //3:使用service完成调用...
        categoryService.page(pageInfo,wrapper);
        //4:分页对象封装到结果对象中
        return R.success(pageInfo);
    }

    /*
      删除业务 根据id删除
     */
    @DeleteMapping
    public R<String> deleteCategory(Long id){
        log.info("根据分类id删除:"+id);
        //获取id 交给service处理
       // categoryService.removeById(id);

        //我要使用一个带有逻辑判断的删除方法了
        // 默认的方法有没有逻辑判断? 没有
         categoryService.remove(id);
        return R.success("删除分类信息成功");
    }

    /**
     * 完成 根据id修改分类信息
     */
    @PutMapping
    public R<String> update(@RequestBody Category category){
        log.info("编辑的数据:{}",category);
        categoryService.updateById(category);

        return R.success("修改分类信息成功");
    }

    /**
     *  根据条件查询 分类列表信息
     */
//    @GetMapping("/list")
//    public R<List<Category>> list(int type){
//
//    }
    /**
     *  根据条件查询 分类列表信息
     *    上面的方法条件只能是根据类型查询
     *    下面的方法 可以根据各种各样的条件查
     *       只要是 Category包含的属性 都能作为条件
     *       下面这个方法  格局更大!!!
     */
    @GetMapping("/list")
    public R<List<Category>> list(Category category){
      //条件查询多个内容
        // 条件构造器
        LambdaQueryWrapper<Category> wrapper = new LambdaQueryWrapper<>();
        //解析 条件参数
        Integer type = category.getType();
//        if(type!=null){//如果 type!=null 条件符合 做拼接
//            wrapper.eq(Category::getType,type);
//        }
        // 条件成立才拼
        wrapper.eq(type!=null,Category::getType,type);
        //解析 条件
        String name = category.getName();
//        wrapper.like(name!=null&name.length()>0,Category::getName,name);
        //骚操作 字符串判断是否为空  这是扩展知识.....
        // 不成立不拼
        wrapper.like(StringUtils.isNotEmpty(name),Category::getName,name);
        // StringUtils.isNotEmpty(name)  做了 name!=null&name.length()>0
        wrapper.orderByAsc(Category::getSort);//根据排序规则展示
        // 调用方法                 查询多条记录方法
        List<Category> list = categoryService.list(wrapper);

        return R.success(list);
    }
}
